/* 
 * File:   Sesion.h
 * Author: max
 *
 * Created on October 18, 2012, 7:00 PM
 */

#ifndef SESION_H
#define	SESION_H

#include <vector>
#include "common_Thread.h"
#include "common_Mutex.h"
#include "server_IManejadorSesionEvento.h"
#include "server_IMensajeEntranteManejador.h"
#include "server_IMensajero.h"
#include "server_IEnviante.h"
#include "server_SockEndPointAsincronico.h"

using namespace std;
using namespace TP;
using namespace TP::Threading;
using namespace TP::Comunicacion::Asincronica;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Comunicacion {
    
    class Sesion : public Thread::Thread , public IMensajero, public IEnviante {

    public:
        
        Sesion(SockEndPointAsincronico* pEndPoint);
        
        virtual ~Sesion();

        void agregarMensajeEntranteManejador (IMensajeEntranteManejador* pManejador);
        
        void agregarManejadorSesionEvento (IManejadorSesionEvento* pManejador);
        
        virtual void Iniciar() throw (Excepcion&);

        virtual void Finalizar() throw (Excepcion&);

        virtual void Responder (const string& pMensaje) throw (Excepcion&);
        
        bool GetFinalizada ();
        
        bool SetFinalizada (bool pValor);
        
        bool GetAutenticada();
        
        bool SetAutenticada(bool pValor);
        
        string GetUsuario();
        
        string SetUsuario(const string& pValor);
        
        string& GetCredencial ();

        void Segurizar(const string &pClave);
        
    protected:

        virtual void tarea ();
        
    private:

        bool EsCredencial (const string & pMensaje);

        const string& notificarMensaje (const string& pMensaje);
        SockEndPointAsincronico* _endPoint;
        IManejadorSesionEvento* manejadorSesionEvento;
        vector<IMensajeEntranteManejador* > mensajeSesionManejadores;
        
        bool errorConexion;
        
        bool _sesionFinalizada;
        Mutex _sesionFinalizadaMutex;
        
        bool _autenticada;
        Mutex _autenticadaMutex;
        
        string _usuario;
        Mutex _usuarioMutex;
        
        string _credencial;
    };
}}

#endif	/* SESION_H */

